/**
 * 
 */
package baduga.server.fasada;

import baduga.core.Core_JsonDataSchema;
import baduga.server.Controler;
import baduga.server.Player;
import baduga.server.Serwer;
import baduga.server.Table;

/**
 * @author Janek
 *
 */
public class F_TableEnvSwitch {
	
	private  Serwer srvCore = Controler.getcSerwer();
	
	/**
	 * 
	 * @param wData
	 * @return
	 */
	public Core_JsonDataSchema makeTable(final Core_JsonDataSchema wData)
	{
		//Def.
		Core_JsonDataSchema repData; 
		Player tmpPla;
		Table tmpTbl;

		
		//Def. Result
		Object[] resultOp;
		

		
		repData = new Core_JsonDataSchema(0x04, new int[] {
			0x01
		},null, null);
		
		
		//Sprawdzenie gracza
		resultOp = srvCore.getPlayer( (String) wData.getDataD1()[0]);
		
		if((boolean) resultOp[0] == true)
		{
			//Definicje
			Object[][] tmpDataD2, tmpDataRez;
			
			
			tmpPla 		= (Player) resultOp[1];
			tmpDataD2 	= wData.getDataD2();
			
			
			/**
			 * 
			 * Operacja Atomowa
			 * 
			 */
			synchronized(this)
			{

				/** Walidacja danych */
				tmpDataRez = Table.validateInput( Core_JsonDataSchema.toInAr(tmpDataD2[0]), Core_JsonDataSchema.toStrAr(tmpDataD2[1]), tmpPla);
				
				if((boolean) tmpDataRez[0][0] == true)
				{
					
					//Utworzenie Obiektu stołu
					tmpTbl = new Table( Core_JsonDataSchema.toInAr(tmpDataD2[0]), Core_JsonDataSchema.toStrAr(tmpDataD2[1]), tmpPla);
					
					
					resultOp = srvCore.addTable(tmpTbl);

					
					if((boolean) resultOp[0] == true)
					{
						repData.setDataD1(new Object[] {
							true
						});
					}
					else
					{
						repData.setDataD1(new Object[] {
							false, resultOp[1]
						});
					}
					
				}
				else
				{
					repData.setDataD1(new Object[] {
						false
					});
					
					
					repData.setDataD2(new Object[][] {
						tmpDataRez[1]
					});
				}
			}//Synhro
			
			
			
			
		}
		else
		{
			repData.setDataD1(new Object[] {
				false, resultOp[1]
			});
		}
		
		
		
		return repData;
	}
	
	
	/**
	 * 
	 * @param wData
	 * @return
	 */
	public Core_JsonDataSchema playerJoinTable(final Core_JsonDataSchema wData)
	{

		
		//Def.
		Core_JsonDataSchema repData; 
		Player tmpPla;
		Table tmpTbl;
		
		//Def. Result
		Object[] resultOp;
		
		//Inicjalizacja
		repData = new Core_JsonDataSchema(0x04, new int[] {
			0x02
		},null, null);
		
		
		
		
		//Sprawdzenie gracza
		resultOp = srvCore.getPlayer( (String) wData.getDataD1()[0]);
		
		if((boolean) resultOp[0] == true)
		{
			
			tmpPla 	= (Player) resultOp[1];
			
			
			//Pobranie stołu
			resultOp = srvCore.getTable( (String) wData.getDataD1()[1]);
			
			if((boolean) resultOp[0] == true)
			{
				tmpTbl 	= (Table) resultOp[1];
				
				
				//Wykonanie migracji
				resultOp = tmpTbl.playerMigrContr(tmpPla, new int[] {0, 0});
				
				if((boolean) resultOp[0] == true)
				{
					
					
					repData.setDataD1(new Object[] {
						true
					});
					
					
					//Pobranie danych o stole
					repData.setDataD2(
						tmpTbl.getTableData(tmpPla.getPlayerId() )
					);
					
				}
				
				
				
			}

			
		}

		
		
		
		if((boolean) resultOp[0] == false)
		{
			repData.setDataD1(new Object[] {
				false, resultOp[1]
			});
		}
		
		
		
		return repData;
	}
	
	
	
	
	/**
	 * 
	 * @param wData
	 * @return
	 */
	public Core_JsonDataSchema playerLeftTable(final Core_JsonDataSchema wData)
	{
		//Def.
		Core_JsonDataSchema repData; 
		Player tmpPla;
		Table tmpTbl;
		
		//Def. Result
		Object[] resultOp;
		
		//Inicjalizacja
		repData = new Core_JsonDataSchema(0x04, new int[] {
				0x03
		},null, null);
		
		
		
		
		//Sprawdzenie gracza
		resultOp = srvCore.getPlayer( (String) wData.getDataD1()[0]);
		
		if((boolean) resultOp[0] == true)
		{
			
			tmpPla 	= (Player) resultOp[1];
			
			
			//Pobranie stołu
			resultOp = srvCore.getTable( tmpPla.getTableId() );
			
			if((boolean) resultOp[0] == true)
			{
				tmpTbl 	= (Table) resultOp[1];
				
				
				//Wykonanie migracji
				resultOp = tmpTbl.playerMigrContr(tmpPla, new int[] {1, tmpPla.getStatusPlayerForTable()});
				
				if((boolean) resultOp[0] == true)
				{
					repData.setDataD1(new Object[] {
						true
					});
				}
				
				
				
			}

			
		}

		
		
		
		if((boolean) resultOp[0] == false)
		{
			repData.setDataD1(new Object[] {
				false, resultOp[1]
			});
		}
		
		
		return repData;
		
	}
	
	
	/**
	 * Migracja gracza w Stole. (Zmiana statusu z OBS -> player, player -> OBs)
	 * 
	 * Argumenty o indeksie [1] decyduje o typie migracji
	 * 0 - OBS
	 * 1 - Player
	 * 
	 * @param wData
	 * @return
	 */
	public Core_JsonDataSchema playerMigrationInTable(final Core_JsonDataSchema wData)
	{

		
		//Def.
		Core_JsonDataSchema repData; 
		Player tmpPla;
		Table tmpTbl;
		
		//Def. Result
		Object[] resultOp;
		
		//Inicjalizacja
		repData = new Core_JsonDataSchema(
			0x04, 
			wData.getArgs().clone(),
			null,
			null
		);
		
		
		
		
		//Sprawdzenie gracza
		resultOp = srvCore.getPlayer( (String) wData.getDataD1()[0]);
		
		if((boolean) resultOp[0] == true)
		{
			
			tmpPla 	= (Player) resultOp[1];
			
			
			//Pobranie stołu z Ciała gracza
			resultOp = srvCore.getTable( tmpPla.getTableId() );
			
			if((boolean) resultOp[0] == true)
			{
				tmpTbl 	= (Table) resultOp[1];
				
				
				//Wykonanie migracji
				resultOp = tmpTbl.playerMigrContr(tmpPla, new int[] {0, wData.getArgs() [1] });
				
				if((boolean) resultOp[0] == true)
				{
					
					
					repData.setDataD1(new Object[] {
						true
					});
					
					
					//Pobranie danych o stole
					repData.setDataD2(
						tmpTbl.getTableData(tmpPla.getPlayerId() )
					);
					
				}
				
				
				
			}

			
		}

		
		
		
		if((boolean) resultOp[0] == false)
		{
			repData.setDataD1(new Object[] {
				false, resultOp[1]
			});
		}
		
		
		
		return repData;
	}
	
	
	
	/**
	 * Przesyła informacje do stołu o gotowości graczy do podjęcia ryzyka
	 * 
	 * @param wData
	 * @return
	 */
	public Core_JsonDataSchema playerIsReady(final Core_JsonDataSchema wData)
	{
		//Def.
		Core_JsonDataSchema repData; 
		Player tmpPla;
		Table tmpTbl;
		
		//Def. Result
		Object[] resultOp;
		
		//Inicjalizacja
		repData = new Core_JsonDataSchema(
			0x04, 
			wData.getArgs().clone(),
			null,
			null
		);
		
		
		//Sprawdzenie gracza
		resultOp = srvCore.getPlayer( (String) wData.getDataD1()[0]);
		
		if((boolean) resultOp[0] == true)
		{
			
			tmpPla 	= (Player) resultOp[1];
			
			
			//Pobranie stołu z Ciała gracza
			resultOp = srvCore.getTable( tmpPla.getTableId() );
			
			if((boolean) resultOp[0] == true)
			{
				tmpTbl 	= (Table) resultOp[1];
		
		
				
				resultOp = tmpTbl.submitReadyStatus( tmpPla );
				
		
				
				if((boolean) resultOp[0] == true)
				{
					repData.setDataD1(new Object[] {
						true
					});
				}
				
			}

			
		}

		
		
		
		if((boolean) resultOp[0] == false)
		{
			repData.setDataD1(new Object[] {
				false, resultOp[1]
			});
		}
		
		
		
		
		return repData;
	}

}
